<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Generator函数的异步应用</title>
  <style>
      body {
        color: #333;
        line-height: 40px;
      }
      span {
        color: red;
      }
    </style>
</head>
<body>
  <h2>基本概念</h2>
  <h3>异步</h3>
  <ul>
    <li>Javascript语言的执行环境是“单线程”的，如果没有异步编程，根本无法使用，不然会造成卡死</li>
    <li>
      所谓异步，就是一个任务,<span>不是连续完成的</span>，可以理解成该任务被人分成了两段，先执行第一段，然后转而执行其他任务，等做好准备后，再回过头执行第二段
    </li>
    <li>相应的，连续执行叫做同步</li>
  </ul>

  <h3>Promise处理异步</h3>
  <ul>
    <li>
      Promise对象就是为了解决“嵌套回调函数过多”的问题提出的。它不是新的语法功能，而是一种新的写法，允许将回调函数的嵌套改成链式调用
    </li>
    <li>
      Promise的写法只是回调函数的改进，使用then方法执行以后，异步任务的两段执行更清楚了，除此之外，并无新意
    </li>
    <li>
      Promise处理异步的最大问题是代码冗余，原来的任务被Promise包装之后，无论什么操作，一眼看去都是许多then的堆积，原来的语义变得很不清楚
    </li>
  </ul>

  <h2>Generator函数</h2>
  <h3>协程</h3>
  <ul>
    <li>
      yield就像是异步两个阶段的分界线
    </li>
    <li>协程遇到yield命令就暂停，等到执行权返回，再从暂停的地方继续往后执行</li>
    <li>
      Generator函数可以暂停执行和恢复执行，这是它能封装异步任务的根本原因。除此之外，还有两个特性使得它可以作为异步编程的完整解决方案：<span>函数体内外的数据交换和错误处理机制</span>
    </li>
  </ul>
</body>
</html>